/*
 * @Author: 鱿鱼溪学院
 * @Date: 2025-04-05 22:22:21
 * @LastEditTime: 2025-04-20 18:50:32
 * @LastEditors: 鱿鱼溪学院
 * @Description:
 * @FilePath: \yyx_ser_ts\app\router\decorator\use.ts
 * Copyright 鱿鱼溪学院 by edu v1.0
 * 天道酬勤
 */
// 导入必要的类型和模块
import { Context, Middleware, Next } from 'koa'
import { RouterContext } from 'koa-router'
import 'reflect-metadata'
//import { RouterCtx, MiddleNext } from '../utils/types'

/**
 * 使用中间件的装饰器函数
 *
 * 该装饰器用于在特定方法或类上注册一个中间件，以便在请求处理时按指定顺序执行
 *
 * @param {Middleware} middleware - 要应用的中间件函数，它接受上下文和下一个中间件函数作为参数
 * @param {'last' | number} position - 中间件的插入位置，默认为最后，也可以指定一个索引位置
 * @returns {Function} 装饰器函数，用于处理类或方法
 */
export function use(
  middleware: (ctx: RouterContext, next: Next) => Promise<any>,
  position: 'last' | number = 'last'
) {
  return function (target: any, key: string) {
    // 获取目标方法或类上已有的中间件数组，如果没有则初始化为空数组
    const middlewares = Reflect.getMetadata('middlewares', target, key) || []
    // 根据指定的位置插入中间件
    if (position === 'last') {
      middlewares.push(middleware)
    } else {
      middlewares.splice(position, 0, middleware)
    }
    // 更新目标方法或类上的中间件数组
    Reflect.defineMetadata('middlewares', middlewares, target, key)
  }
}
